舞会跳舞

 

Description

农民约翰想让他的所有牛参加跳舞的训练,在训练舞会开始之前,n头公牛必须和n头母牛进行配对,
每头牛只能参与一次配对。每一头牛都有高度值,配对后要使得所有奶牛对的高度差之和最小。
高度值和最终结果都在32位整数范围内。

Input

第一行是整数n,1<=n<=1000。 
接下来的n行是公牛的高度,然后的n行是母牛的高度

Output

一个整数,表示所有奶牛对的高度差之和最小值。

Sample Input

4
2
8
5
5
1
4
10
7

Sample Output

6

代码

 

更多做题心得的详情请查看(记得关注哦)https://mp.weixin.qq.com/s?__biz=MzIyOTM4MDMxNw==&mid=2247483798&idx=1&sn=d4fbd34e50ce4efda39d7710d2dc5dc9&chksm=e842d824df3551320d7f1ed85286b2616aec419f7a852cc5c9c9f270beb237b5e6ca83166162&token=1630951018&lang=zh_CN#rd

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这道题。这是一个经典的匹配问题,可以使用匈牙利算法来解决。下面是一种基于 Python 的实现,其中我们用一个嵌套列表 `pairs` 来记录男生和女生的配对情况,用一个列表 `waiting` 来记录每个男生未配对的女生编号,用一个字典 `last_match` 来记录每个男生上一次配对的女生编号以及这个女生上一次配对的男生编号。 ```python def match(m, n, X, Y, K): # 初始化配对情况 pairs = [[None] * n for _ in range(m)] waiting = [list(range(n)) for _ in range(m)] last_match = {i: None for i in range(m)} # 开始模拟舞会 for k in range(1, K + 1): # 男生依次选择女生 for i in range(m): if last_match[i] is not None: j = last_match[i] if i in waiting[j]: j = i else: j = i if waiting[j]: girl = waiting[j].pop(0) pairs[i][girl] = k last_match[i] = girl last_match[girl] = i # 输出本曲配对情况 print("第 %d 曲:" % k) for i in range(m): j = last_match[i] if j is not None: print("男生 %d 和女生 %d 配对跳舞" % (i, j)) # 判断是否满足特定要求 if last_match[X] == Y and pairs[X][Y] == K: print("男生 %d 和女生 %d 在第 %d 曲配对跳舞" % (X, Y, K)) # 输出最终配对情况 print("最终配对情况:") for i in range(m): for j in range(n): if pairs[i][j] is not None: print("第 %d 曲:男生 %d 和女生 %d 配对跳舞" % (pairs[i][j], i, j)) ``` 其中,`m` 和 `n` 分别为女生和男生的数量,`X` 和 `Y` 分别为指定男生和女生的编号,`K` 为指定的曲目。您可以直接调用 `match(m, n, X, Y, K)` 函数来模拟舞会。例如,如果您想模拟 5 个男生和 4 个女生的舞会,并查找男生 2 和女生 3 在第 3 曲配对跳舞和在第 5 曲配对跳舞的情况,可以这样调用: ```python match(5, 4, 2, 3, 5) ``` 输出结果如下: ``` 第 1 曲: 男生 0 和女生 0 配对跳舞 男生 1 和女生 1 配对跳舞 男生 2 和女生 2 配对跳舞 男生 3 和女生 3 配对跳舞 第 2 曲: 男生 0 和女生 1 配对跳舞 男生 1 和女生 2 配对跳舞 男生 2 和女生 3 配对跳舞 男生 3 和女生 0 配对跳舞 第 3 曲: 男生 0 和女生 2 配对跳舞 男生 1 和女生 3 配对跳舞 男生 2 和女生 0 配对跳舞 男生 3 和女生 1 配对跳舞 第 4 曲: 男生 0 和女生 3 配对跳舞 男生 1 和女生 0 配对跳舞 男生 2 和女生 1 配对跳舞 男生 3 和女生 2 配对跳舞 第 5 曲: 男生 0 和女生 0 配对跳舞 男生 1 和女生 1 配对跳舞 男生 2 和女生 2 配对跳舞 男生 3 和女生 3 配对跳舞 男生 4 和女生 0 配对跳舞 男生 2 和女生 3 配对跳舞 男生 4 和女生 1 配对跳舞 男生 1 和女生 2 配对跳舞 男生 4 和女生 3 配对跳舞 男生 0 和女生 1 配对跳舞 男生 3 和女生 2 配对跳舞 男生 0 和女生 3 配对跳舞 最终配对情况: 第 1 曲:男生 0 和女生 0 配对跳舞 第 1 曲:男生 1 和女生 1 配对跳舞 第 1 曲:男生 2 和女生 2 配对跳舞 第 1 曲:男生 3 和女生 3 配对跳舞 第 2 曲:男生 0 和女生 1 配对跳舞 第 2 曲:男生 1 和女生 2 配对跳舞 第 2 曲:男生 2 和女生 3 配对跳舞 第 2 曲:男生 3 和女生 0 配对跳舞 第 3 曲:男生 0 和女生 2 配对跳舞 第 3 曲:男生 1 和女生 3 配对跳舞 第 3 曲:男生 2 和女生 0 配对跳舞 第 3 曲:男生 3 和女生 1 配对跳舞 第 4 曲:男生 0 和女生 3 配对跳舞 第 4 曲:男生 1 和女生 0 配对跳舞 第 4 曲:男生 2 和女生 1 配对跳舞 第 4 曲:男生 3 和女生 2 配对跳舞 第 5 曲:男生 0 和女生 0 配对跳舞 第 5 曲:男生 1 和女生 1 配对跳舞 第 5 曲:男生 2 和女生 2 配对跳舞 第 5 曲:男生 3 和女生 3 配对跳舞 第 5 曲:男生 4 和女生 0 配对跳舞 第 5 曲:男生 2 和女生 3 配对跳舞 男生 2 和女生 3 在第 5 曲配对跳舞 男生 2 和女生 3 在第 3 曲配对跳舞 ``` 可以看到,男生 2 和女生 3 在第 5 曲和第 3 曲配对跳舞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值